package com.jdbc.jdbc;

import java.sql.*;
import java.util.Scanner;

/**
 * JDBC-3
 * Description: 使用预编译PreparedStatement防止SQL注入
 *
 * TODO：
 *  DriverManager Statement        静态SQL，没有动态值语句，存在SQL注入等风险，
 *  DriverManager PrepareStatement 预编译SQL，有动态值语句，推荐使用
 */
public class JdbcPreparedStatementLoginPart {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        // 键盘输入要查询的用户信息id和account：1,root
        Scanner scanner = new Scanner(System.in);
        String id = scanner.nextLine();
        String account = scanner.nextLine();
        scanner.close();

        // 1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "root");

        // 3. 创建statement对象
        /**
         * 方案一：connection.createStatement(sql)
         * 问题：Statement 执行拼接赋值的SQL语句，存在SQL注入问题
         *
         * 方案二：connection.prepareStatement(sql);
         * 解决：
         *  1. PreparedStatement 预编译SQL语句，执行完整SQL，动态值用占位符 ? 替代，? 只能替代值，不能替代关键字和容器名
         *  2. PreparedStatement 通过 setObject() 方法从左到右依次给占位符 ? 赋值
         *  3. setObject() 方法入参：int 从1开始表示占位符的下角标、object 表示占位符的值。
         */
        String sql = "select * from t_user where id = ? and account = ? ;";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setObject(1, id);
        preparedStatement.setObject(2, account);

        // 4. 执行SQL语句，并获取返回结果。
        ResultSet resultSet = preparedStatement.executeQuery();

        // 5. 结果集对象解析
        if (resultSet.next()){
            //只要向下移动，就是有数据 就是登录成功！
            System.out.println("登录成功！");
        }else{
            System.out.println("登录失败！");
        }

        // 6. 关闭资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }

}
